package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.heima.common.dto.PageResponseResult;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.user.dto.ApAuthor;
import com.heima.user.dto.AuthDto;
import com.heima.user.dto.WmUser;
import com.heima.user.entity.ApUser;
import com.heima.user.entity.ApUserRealname;
import com.heima.user.feign.ArticleClient;
import com.heima.user.feign.MediaClient;
import com.heima.user.mapper.ApUserRealnameMapper;
import com.heima.user.service.IApUserRealnameService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.user.service.IApUserService;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * APP实名认证信息表 服务实现类
 * </p>
 *
 * @author PG
 * @since 2022-06-21
 */
@Service
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname> implements IApUserRealnameService {

    @Autowired
    IApUserService userService; // APP用户信息表

    @Autowired
    MediaClient mediaClient; // 远程调用自媒体微服务

    @Autowired
    ArticleClient articleClient; // 远程调用文章微服

    /**
     *APP 实名  认证信息 分页查询  按状态模糊查询
     * @param dto
     * @return
     */
    @Override
    public ResponseResult listByStatus(AuthDto dto) {
        //1. 进行分页查询
        //2. 构建分页条件
        IPage<ApUserRealname> page = new Page<>(dto.getPage(), dto.getSize());
        //3. 构建条件查询
        LambdaQueryWrapper<ApUserRealname> query = new LambdaQueryWrapper<>();
        //4. 根据状态进行查询
        if (dto.getStatus() != null){
            //5. 前端传过来的状态不为空, 构建 状态模糊查询 条件
            query.eq(ApUserRealname::getStatus, dto.getStatus());
        }
        // batisPlus 开始分页查询
        IPage<ApUserRealname> realUserPage = this.page(page, query);
        // 构建返回前端页面的对象
        PageResponseResult<List<ApUserRealname>> result = new PageResponseResult<>(
                dto.getPage(), dto.getSize(), realUserPage.getTotal(), realUserPage.getRecords());
        return result;
    }

    /**
     * 平台审核用户, 用户认证后审核 通过传1, 失败传0 用一个方法完成
     * @param dto
     * @param type
     * @return
     */
    @Override
    @GlobalTransactional // 微服务全局事务 默认AT模式
    public ResponseResult auth(AuthDto dto, int type) {
        //1. 审核失败
        //1.1 根据id查询认证表数据
        ApUserRealname userRealMsg= this.getById(dto.getId());
        //1.2 传进来0 说明审核失败, 修改认证状态为2, 并返回失败原因
        if (type == 0){
            userRealMsg.setStatus(2);
            //1.2.1 驳回原因从前端传过来 直接获取set进去
            userRealMsg.setReason(dto.getReason());
            //1.2.2 更新到数据库 ap_user_realname表中
            this.updateById(userRealMsg);
        }


        //2. 审核成功 也就是传过来的 type = 1
        //2.1 查询ap_user 通过 ap_user_realname 表获得 ap_user的 id
        ApUser apUser = userService.getById(userRealMsg.getUserId());
        //2.2 创建自媒体账号, 用ap_user的数据
        WmUser wmUser = createWmUser(apUser);
        //2.3 继续创建文章作者账号, 非空判断,自媒体账号有数据了,才创建
        if (wmUser != null){
            //2.4 创建文章作者账号 用ap_user 和wm_user数据
            ApAuthor author = createAuthor(apUser,wmUser);
            //2.5 如果文章作者账号创建成功, 非空了, 修改认证表的状态为9 代表审核通过
            if (author != null){
                //2.6 set进APP实名认证信息表状态为9
                userRealMsg.setStatus(9);
                //2.7 修改APP实名认证信息表 状态为9
                this.updateById(userRealMsg);
            }
            //2.7审核成功返回成功标识
            return ResponseResult.okResult();
        }
        //走到这说明 其中环节出问题, 返回参数无效
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }

    /**
     * 2.4 创建文章作者账号
     * @param apUser
     * @param wmUser
     * @return
     */
    private ApAuthor createAuthor(ApUser apUser, WmUser wmUser) {
        //1. 构建文章作者
        ApAuthor author = new ApAuthor();
        //1.1 设置作者名称, 从从用户信息表中获得用户名
        author.setName(apUser.getName());
        //1.2 设置爬取数据的来源: 1为签约合作商, 2为平台自媒体
        author.setType(2);
        //1.3 设置社交账号id,从用户信息表中获得主键id
        author.setUserId(apUser.getId());
        //1.4 设置自媒体账号id, 从自媒体用户信息表中获得主键id
        author.setWmUserId(wmUser.getId());
        //1.5 远程调用文章作者微服务保存作者信息
        ResponseResult<ApAuthor> responseResult = articleClient.saveApAuthor(author);
        //1.6 判断一下远程调用是否成功, 成功才返回数据,远程调用返回的状态码 与成功的状态码作对比
        if (responseResult.getCode().equals(AppHttpCodeEnum.SUCCESS.getCode())){
            //1.7 成功返回作者数据
            ApAuthor apAuthor = responseResult.getData();
            //1.8 作者的主键id写回到自媒体用户表中ap_author_id 设置作者id
            wmUser.setApAuthorId(apAuthor.getId());
            //1.9 远程调用自媒体微服务更新自媒体表中的数据
            mediaClient.updateWmUser(wmUser);
            // 返回作者数据
            return apAuthor;
        }
        return null;
    }

    /**
     * 2.2创建自媒体账号
     * @param apUser
     * @return
     */
    private WmUser createWmUser(ApUser apUser) {
        //1. 构建自媒体用户
        WmUser wmUser = new WmUser();
        //2. 基本属性从ApUser直接copy
        BeanUtils.copyProperties(apUser,wmUser);
        //2.1 id 数据库设置为自增 所以置空
        wmUser.setId(null);
        //2.2 设置 自媒体用户表里的 ApUserId
        wmUser.setApUserId(apUser.getId());
        //2.3 设置昵称 从用户信息表中获得用户名
        wmUser.setNickname(apUser.getName());
        //2.4 设置自媒体用户状态为正常可用 设置9, 0不可用, 1为封号
        wmUser.setStatus(9);
        //2.5 设置账号类型  0为个人, 1企业, 2为子账号
        wmUser.setType(0);
        //3. 调用远程自媒体接口去保存数据
        ResponseResult<WmUser> responseResult = mediaClient.saveWmUser(wmUser);
        // 判断一下远程调用是否成功, 成功才返回数据,远程调用返回的状态码 与成功的状态码作对比
        if (responseResult.getCode().equals(AppHttpCodeEnum.SUCCESS.getCode())){
            WmUser user = responseResult.getData();
            return user;
        }
        return null;
    }
}
